/**   
 * @Title: ScfAssetCoreInformationService.java 
 * @Package com.betterjr.modules.loan.service 
 * @Description: TODO(用一句话描述该文件做什么) 
 * @author xuzx
 * @date 2017年11月21日 下午4:29:11  
 */
package com.betterjr.modules.loan.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.betterjr.common.utils.Collections3;
import com.betterjr.common.utils.UserUtils;
import com.betterjr.modules.acceptbill.entity.ScfAcceptBillDO;
import com.betterjr.modules.acceptbill.service.ScfAcceptBillDOService;
import com.betterjr.modules.credit.service.ScfCreditService;
import com.betterjr.modules.loan.entity.ScfAssetCoreInformation;
import com.betterjr.modules.order.entity.ScfOrderDO;
import com.betterjr.modules.order.service.ScfOrderDOService;
import com.betterjr.modules.receivable.entity.ScfReceivableDO;
import com.betterjr.modules.receivable.service.ScfReceivableDOService;

/** 
 * @ClassName: ScfAssetCoreInformationService 
 * @Description: 核心企业工作台资产信息统计 
 * @author xuzx
 * @date 2017年11月21日 下午4:29:11 
 *  
 */
@Service
public class ScfAssetCoreInformationService {

    @Autowired
    private ScfCreditService scfCreditService;

    @Autowired
    private ScfAcceptBillDOService scfAcceptBillDOService;

    @Autowired
    private ScfReceivableDOService scfReceivableDOService;

    @Autowired
    private ScfOrderDOService scfOrderDOService;

    @Autowired
    private ScfRequestService scfRequestService;

    public ScfAssetCoreInformation queryAllAssetCoreInformation(final Map<String, Object> anMap,
            final Long coreCustNo) {
        Map<String, Object> anParam = Collections3.filterMap(anMap, new String[] { "coreCustNo" });
        ScfAssetCoreInformation scfAssetCoreInformation = new ScfAssetCoreInformation();
        // 核心企业名称
        scfAssetCoreInformation.setCoreName(UserUtils.getDefCustInfo().getCustName());
        // 授信额度信息
        scfAssetCoreInformation.setScfCreditMap(scfCreditService.findCreditSumByCustNo(coreCustNo));
        // 金额区域信息
        scfAssetCoreInformation.setSecuredLoanMap(scfRequestService.queryCoreAmountArea(anParam, coreCustNo));
        // 设置票据统计信息
        final ScfAssetCoreInformation billsPayableInformation = queryAcceptBillDO(anParam);
        // 应付票据笔数
        scfAssetCoreInformation.setBillsPayableCount(billsPayableInformation.getBillsPayableCount());
        // 应付票据总额
        scfAssetCoreInformation.setBillsPayableMoney(billsPayableInformation.getBillsPayableMoney());
        // 未审核应付票据
        scfAssetCoreInformation.setNotAuditedBillsCount(
                (int) scfAcceptBillDOService.queryIneffectiveBill(anParam, "0", "1", 1, 10, true).getTotal());
        // 设置应付账款信息
        final ScfAssetCoreInformation accountsPayableInformation = queryAccountsPayable(anParam);
        // 应付账款金额
        scfAssetCoreInformation.setAccountsPayableMoney(accountsPayableInformation.getAccountsPayableMoney());
        // 应付账款笔数
        scfAssetCoreInformation.setAccountsPayableCount(accountsPayableInformation.getAccountsPayableCount());
        // 未审核应付账款笔数
        scfAssetCoreInformation.setNotAuditedPayableCount(
                (int) scfReceivableDOService.queryIneffectiveReceivable(anParam, "1", 1, 10, true).getTotal());
        // 设置采购订单信息
        final ScfAssetCoreInformation purchaseOrderInformation = queryPurchaseOrder(anParam);
        // 采购订单笔数
        scfAssetCoreInformation.setPurchaseOrderCount(purchaseOrderInformation.getPurchaseOrderCount());
        // 采购订单金额
        scfAssetCoreInformation.setPurchaseOrderMoney(purchaseOrderInformation.getPurchaseOrderMoney());
        // 未审核采购订单笔数
        scfAssetCoreInformation.setNotAuditedOrderCount(
                (int) scfOrderDOService.queryIneffectiveOrder(anParam, "0", "1", 1, 10, true).getTotal());
        return scfAssetCoreInformation;

    }

    /**
     * 
     * @Title: queryAcceptBillDO 
     * @Description: 查看核心企业登记，生效，未使用的票据 
     * @param anMap 前端参数
     * @return 核心企业登记，生效，未使用的票据 
     * @throws 
     * @author xuzx
     * @date 2017年11月22日 下午1:55:32
     */
    private ScfAssetCoreInformation queryAcceptBillDO(final Map<String, Object> anMap) {
        final ScfAssetCoreInformation information = new ScfAssetCoreInformation();
        List<ScfAcceptBillDO> list = scfAcceptBillDOService.queryNotUserBillList(anMap, false);
        information.setBillsPayableCount(list.size());
        information.setBillsPayableMoney(queryAcceptBillDOMoney(list));
        return information;
    }

    /**
     * 
     * @Title: queryAcceptBillDOMoney 
     * @Description: 核心企业登记，生效，未使用的票据应付金额
     * @param list  企业登记，生效，未使用的票据列表
     * @return 应付金额总数
     * @throws 
     * @author xuzx
     * @date 2017年11月22日 下午1:56:16
     */
    private BigDecimal queryAcceptBillDOMoney(final List<ScfAcceptBillDO> list) {
        BigDecimal totalMoney = new BigDecimal(0);
        BigDecimal sum = new BigDecimal(0);
        for (int i = 0; i < list.size(); i++) {
            totalMoney = list.get(i).getBalance();
            if (totalMoney != null) {
                sum = totalMoney.add(sum);
            }
        }
        return sum;
    }

    /**
     * 
     * @Title: queryCoreReceivable 
     * @Description: 查询核心企业登记，生效，未使用的应付账款
     * @param anMap 前端参数
     * @return 核心企业登记，生效，未使用的应付账款列表
     * @throws 
     * @author xuzx
     * @date 2017年11月22日 下午2:02:07
     */
    private ScfAssetCoreInformation queryAccountsPayable(final Map<String, Object> anMap) {
        final ScfAssetCoreInformation information = new ScfAssetCoreInformation();
        List<ScfReceivableDO> list = scfReceivableDOService.queryNotUserReceivableList(anMap, false);
        information.setAccountsPayableCount(list.size());
        information.setAccountsPayableMoney(queryAccountsPayableMoney(list));
        return information;
    }

    /**
     * 
     * @Title: queryAccountsPayableMoney 
     * @Description: 查询核心企业登记，生效，未使用的应付账款总额 
     * @param list  查询核心企业登记，生效，未使用的应付账款列表
     * @return 登记，生效，未使用的应付账款总额
     * @throws 
     * @author xuzx
     * @date 2017年11月22日 下午2:03:23
     */
    private BigDecimal queryAccountsPayableMoney(final List<ScfReceivableDO> list) {
        BigDecimal totalMoney = new BigDecimal(0);
        BigDecimal sum = new BigDecimal(0);
        for (int i = 0; i < list.size(); i++) {
            totalMoney = list.get(i).getBalance();
            if (totalMoney != null) {
                sum = totalMoney.add(sum);
            }
        }
        return sum;
    }

    /**
     * 
     * @Title: queryPurchaseOrder 
     * @Description: 核心企业查询登记，生效，未使用订单 
     * @param anMap 前端参数
     * @return 查询登记，生效，未使用订单列表
     * @throws 
     * @author xuzx
     * @date 2017年11月22日 下午3:19:43
     */
    private ScfAssetCoreInformation queryPurchaseOrder(final Map<String, Object> anMap) {
        final ScfAssetCoreInformation information = new ScfAssetCoreInformation();
        List<ScfOrderDO> list = scfOrderDOService.queryNotUserOrderList(anMap, false);
        information.setPurchaseOrderCount(list.size());
        information.setPurchaseOrderMoney(queryPurchaseOrderMoney(list));
        return information;
    }

    /**
     * 
     * @Title: queryPurchaseOrderMoney 
     * @Description: 核心企业查询登记，生效，未使用订单金额
     * @param 登记，生效，未使用订单列表
     * @return 登记，生效，未使用订单金额
     * @throws 
     * @author xuzx
     * @date 2017年11月22日 下午3:20:35
     */
    private BigDecimal queryPurchaseOrderMoney(final List<ScfOrderDO> list) {
        BigDecimal totalMoney = new BigDecimal(0);
        BigDecimal sum = new BigDecimal(0);
        for (int i = 0; i < list.size(); i++) {
            totalMoney = list.get(i).getBalance();
            if (totalMoney != null) {
                sum = totalMoney.add(sum);
            }
        }
        return sum;
    }

}
